#ifndef _MIXER_
#define _MIXER_

#include <map>
#include <vector>
#include <deque>
#include <iostream>
#include <memory>
#include "SDL_mixer.h"
#include "tsound.h"
#include "tmusic.h"

//! Path donde se encuentran los sonidos
#define DEFAULT_PATH "wav/"
using namespace std;

/** Gestiona el sonido y los samples,
  puede funcionar tanto en modo inmediato
  como encolando los samples para su posterior
  reproduccion. Es un Singleton */

class Mixer
{
public:
    //! Obtiene una instancia del Singleton
    static Mixer *getInstance();
    //! Inicia el mezclador
    bool init();
    //! Inicia el mezclador con parámetros propios
    bool init(int rate,Uint16 format,int channels,int buffers); 
    //! Carga un sonido y devuelve el indice asignado
    int loadFX(const char *);

    //! Carga la musica de fondo, borra y para la anterior si existia
    void loadMusic(const char *);

    //! Reproduce la musica de fondo
    void playMusic();

    //! Para la musica de fondo;
    void stopMusic();

    //! Pausa la musica de fondo;
    void pauseMusic();

    //! Reanuda la música de fondo
    void resumeMusic();

    //! Reproduce un sonido por nombre
    void playFX(const char *);
    //! Reproduce un sonido por indice
    void playFX(unsigned int);
    //! Establece el path
    void setPath(string &);
    //! Devuelve el path
    string getPath();
    //! Incrementa el volumen de los FX
    void upFXVolume(int);
    //! Decrementa el volumen de los FX
    void downFXVolume(int);
    //! Incrementa el volumen de la Musica
    void upMusicVolume(int);
    //! Decrementa el volumen de la Musica
    void downMusicVolume(int);

   
private:
    //! Constructor por defecto
    Mixer();
    //! Diccionario de nombres->indices
    std::map<const char *,unsigned int> diccionario;
    //! Matriz de samples de SDL
    std::vector<TSound *>  vector;
    //! Puntero de recoleccion automatica
    static Mixer *inst;
    //! Path donde están los archivos de sonido
    string path;
    //! Frecuencia de audio
    int audio_rate;
    //! Formato de audio
    Uint16 audio_format;
    //! Numero de canales
    int audio_channels;
    //! Volumen de los efectos
    int vol_sound;
    //! Volumen de la música
    int vol_music;
    //! Tamaño del buffer de audio
    int audio_buffers;
    //! Musica en reproduccion
    TMusic *my_music;
};

#endif

